ТАКСОФОННЫЕ СМАРТ-КАРТЫ 

 

  1. Типы применяемых карточек

 

В сети МГТС установлены карточные таксофоны, принимающие карточки по меньшей мере трех типов.
Внешне карточки разных типов можно различить по форме контактов чипа:

  тип 1 тип 2 тип 3

Первая и вторая карточки отвечают стандартам ISO 7816-1 и ISO 7816-2 соответсвенно. Третий тип пока мной неисследован. Карточки содержат электрически программируемое ПЗУ емкостью 256 * 1 бит с последовательной побитной выдачей информации и внутренним инкрементным счетчиком адреса. Операция записи производит изменение состояния ячеек памяти "в одну сторону", обратное изменение (стирание) интерфейсом карточки не предусмотрено. Память можно было бы стереть ультрафиолетом, но чип закрыт контактной панелью и специальной смолой. Можно применить для стирания чипа жесткое излучение. Казалось бы, можно запрограммировать заново всю карточку, однако первые 96 бит памяяти, где прошиты тип карточки и код производителя, защищены от записи предохранителем, пережигаемым на заводе после прошивки чипа.
По этим причинам использованную карточку нельзя "перезарядить", чтобы она работала, как новая. Единственный способ обмануть таксофоны - использовать электронный эмулятор карточки.
Однако карточки можно еще использовать для самодельных систем идентификации, кодовых замков и т. п. целей.

2.      Физический стандарт ISO

На рисунке показана нумерация контактов чипа карточки

  нумерация контактов

Соответствие контактов сигналам:

 

Тип ISO 7816-1

Тип ISO 7816-2

1

Vcc +5V

1

Vcc +5V

2

R/W

2

Reset

3

Clock

3

Clock

4

Reset

4

5

Gnd

5

Gnd

6

Vpp +21V

6

 

7

I/O

7

I/O

 

8

Fuse

8

 

Карточки типа 2 совместимы сверху вниз с карточками типа 1. Для распознавания типа карточки таксофон начинает работать по стандарту 2, и если вместо данных идут только одни единицы, переходит на тип 1.
Диаграмма сигналов для карточки типа 1:

 

+21V                                     _____________

+5V ____________________________________|             |_________________ Vpp

                                        :             :

+5V                  ___________________:_____________:_________________ Reset

0V  ________________|                   :             :

                    :                   :             :

+5V     ____        :      ____         :       ______:______

0V  ___|    |_______:_____|    |________:______|      :      |__________ Clock

       :    :       :     :    :        :      :      :      :

+5V    :    :       :     :    :        :______:______:      :           _

0V  ___:____:_______:_____:____:________|      :      |______:__________ R/W

       :    :       :     :    :        :      :      :      :

+5V    :    :       :_____:    :________:      :      :      :__________

0V  XXXXXXXXXXXXXXXXX_____XXXXXX________XXXXXXXXXXXXXXXXXXXXXX__________ Out

       :    :       :     :    :        :<-----><---->:      :

       :    :       :     :    :        :10 to   10 to       :

       :    :       :     :    :        :50 ms   50ms        :

        Reset        Bit 1        Bit2                           Bit 3

        card        reading      reading  Bit2 writing to 1     reading

В "чистом" виде ячейки памяти чипа типа -1 содержат 0, операция записи прошивает в ячейку 1.

 


Диаграмма сигналов чтения для карточки типа 2:

 

_____|                  |_____________________________________________ Reset

     :                  :

     :        _____     :  _____       _____       _____       _____

_____:_______|     |____:_|     |_____|     |_____|     |_____|     |_ Clk

     :       :          : :     :     :     :     :     :     :     :

_____:_______:__________:_:_____:_____:_____:_____:_____:_____:_____:_

_____:___n___|_____0____:_|_____1_____|_____2_____|_____3_____|___4_:_ (Address)

     :                  :       :           :           :           :

_____:                  :_______:___________:___________:___________:_

_____XXXXXXXXXXXXXXXXXXXX_______|___________|___________|___________|_ Data

Bit n                      Bit 0    Bit 1        Bit2       Bit3


В "чистом" виде ячейки памяти чипа типа -2 содержат 1, запись меняет значение на 0.
Карточки типа 2 не требуют для записи подачи напряжения программирования +21В, так как имеют встроенный умножитель напряжения.
Диаграмма сигналов последовательной записи для карточки типа 2:

 

___________|     |______________________________|     |_______________ Reset

            :                                    :

    ___     :           _____           ___      :           _____

___|   |____:__________|     |_________|   |_____:__________|     |____ Clk

   :        :          :     :         :   :     :          :     :

___:________:__________:_____:_________:___:_____:__________:_____:_____

n  |      n+1          |     n+2       |   :    n+3         |     :      (Addr)

---'--------:----------'-----:---------'---:-----:----------'-----:-----

            :          :     :             :     :          :     :

________   _:          :     : ____________:  ___:          :     :

________XXX_XXXXXXXXXXXXXXXXXXX____________ XX___XXXXXXXXXXXXXXXXXXXXXXX I/O

  n      n+1           :     :     n+1        n+2           :     :

                       :     :                              :     :

                        write                                write

Диаграмма сигналов записи со сбросом адреса в 0 для карточки типа 2:

 

______|     |____________________|     |_________________________________  Rst

      :                          :

      :            _______       :              _______        ___

______:___________|       |______:_____________|       |______|   |______  Clk

      :           :       :      :             :       :      :   :

      :           :       :      :             :       :      :   :

<------------------------- address n ------------------------>:<--- n+1 ------

      :           :       :      :             :       :          :

      :           :       :      :             :       :          :

______:           :       :______:             :       :__________: _____

______XXXXXXXXXXXXXXXXXXXXX______XXXXXXXXXXXXXXXXXXXXXXX__________XX_____  I/O

                  :       :  n                 :       :     n        n+1

                  :       :                    :       :

                    Write                        Erase

Для карточек типа 2 следует учитывать, что счетчик адреса не сбрасывается в диапазоне адресов 0 - 7.

 

  1. Что записано на карточках?

 

  Теперь  мы  и  подошли  к самому  интересному  месту  -

   назначению  каждого бита, записанного на карте. Естественно,

   что  на  картах других городов это назначение будет  другим,

   но  мы,  как  обещали,  говорим о  питерских  карточках.  На

   карточке  используются только 16 байт. Все  остальные  равны

   0xFF.  В  процессе  исследований  было  считано  около   300

   карточек.

 

        Примеры памяти карт

 

   Эта карта на 50 единиц закончилась. Номер 0050415503.

   Годна до 30.09.98

   E9, 30, FF, 01, F1, E2, 80, C0

   00, 00, 00, 00, 00, FF, 18, EA

 

   Эта карта на 400 единиц также пуста. Номер 0400155921.

   Годна до 30.09.98

   E9, 30, FF, 01, 88, A7, 9B, E8

   00, 00, 00, 00, 00, FF, D9, 79

 

   Вот карта на 1000 единиц. Осталось 998. Номер 1000013039.

   Годна до 31.12.99

   E9, 30, FF, 01, F7, 3F, 59, DC

   00, 01, 7F, 0F, 3F, FF, 68, 6B

 

   Потом я позвонил по этой карте. Осталось 6 единиц.

   E9, 30, FF, 01, F7, 3F, 59, DC

   00, 00, 00, 00, 3F, FF, 68, 6B

 

   Наконец, она закончилась.

   E9, 30, FF, 01, F7, 3F, 59, DC

   00, 00, 00, 00, 00, FF, 68, 6B

 

        Назначение полей

 

   1.  Первые  4 байта - какой-то идентификатор. На всех картах

       E9, 30, FF, 01.

 

   2.  Следующие  4  байта  - серийный номер карты.  Расположив

       биты  в байтах в обратном порядке, а затем и сами байты,

       получим  32 разрядное целое без знака. К примеру,  байты

       F7,  3F, 59, DC с обратным порядком бит выглядят как EF,

       FC,   9A,   3B.  Получим  номер  карты  0x3B9AFCEF   или

       1000013039  в  десятичном виде. Нетрудно  заметить,  что

       номер,  напечатанный  на карте,  всегда  состоит  из  10

       цифр, а первые 4 цифры - емкость карточки.

 

   3.  Следующие  5  байт  - количество единиц,  оставшихся  на

       карточке.     Формат    хранения    очень    интересный:

       используется   количество  единичных  битов   в   байте,

       начиная  с  младшего. Соответственно значение  байта  07

       соответствует 3 единицам, значение 1F -  пяти,  а  7F  -

       семи    единицам.   Максимальное   количество    единиц,

       хранящихся  в  байте - семь. Соответственно используется

       восьмеричная  система  счисления. Таким  образом,  байты

       00,  01,  7F,  0F, 3F соответствуют 01746 в восьмеричной

       системе   или   998   единиц   в   десятичной   системе.

       Максимальное  количество единиц может выражаться  числом

       77777 в восьмеричной или 32767 в десятичной системе.

 

   4.  Следующий   байт  всегда  равен  FF.   Похоже,   он   не

       используется.

 

   5.  Два  последних  байта,  по-видимому,  выражают  CRC  или

       другой  контрольный  код для первых 8  постоянных  байт,

       т.к.  при  расходовании единиц они не  меняются,  но  на

       каждой карточке они свои. Пока их назначение не ясно.

 

        Обнаружилось,  что срок годности не записан  на  карте.

   По  всей  видимости,  он  как-то  связан  с  номером  карты.

   Возможно,  каждому сроку годности соответствуют определенный

   диапазон номеров.

 

        Как  уже  говорилось,  из  10  цифр  номера  первые   4

   выражают  емкость  карты.  Оставшиеся  6  не  идентифицируют

   карту  однозначно,  т.к. уже выпущено более  миллиона  карт.

   Всего  при  подобной системе нумерации может существовать  6

   миллионов карт:

   * На 25 единиц с номерами от 0025000000 до 0025999999

   * На 50 единиц с номерами от 0050000000 до 0050999999

   * На 100 единиц с номерами от 0100000000 до 0100999999

   * На 200 единиц с номерами от 0200000000 до 0200999999

   * На 400 единиц с номерами от 0400000000 до 0400999999

   * На 1000 единиц с номерами от 1000000000 до 1000999999

 

       (С) Alien AKA Dimik (dimik@infopro.spb.su)

 

В принципе карточки МГТС организованы подобным же образом, единственное отличие состоит в разных кодах идентификации карточки, ессно, они для каждой зоны разные

 

  1. Читалка карточек

 

Принципиальная схема читалки, подключаемой в параллельный порт РС:

  схема читалки

 

Схему можно упростить, исключив транзисторы и прочие детали, относящиеся к отработке записи карточек типа 1 (запись карточек типа 2 все равно будет работать).  

1. Аппаратная часть - разъем портаСоединительная розетка порта имеет следующий вид и расположение контактов:

розетка порта

Назначение контактов (специфика работы с принтером) следующее:

 

 1     STROBE                 - Строб (НИЗКИЙ означает что можно читать данные)

 2     DATA 1                 - линия данных 1

 3     DATA 2                 - " 2

 4     DATA 3                 - " 3

 5     DATA 4                 - " 4

 6     DATA 5                 - " 5

 7     DATA 6                 - " 6

 8     DATA 7                 - " 7

 9     DATA 8                 - " 8

 10    ACKNLG                 - Принято (НИЗКИЙ показывает что данные считаны устройством)

 11    BUSY                   - Занято (ВЫСКОЙ в следующих случаях:

                                     (a) прием данных

                                     (b) печать

                                     (c) принтер офф-лайн

                                     (d) ошибка принтера)

 12    PE                     - Нет бумаги (ВЫСОКИЙ если в принтере не бумаги)

 13    SLCT                   - Выбор (ВЫСОКИЙ если принтер выбран)

 14    AUTO FEED XT           - Авто-перевод строки (НИЗКИЙ показывает принтер будет автоматически переводить строку

                                после знака "возврат каретки". Зависит от установки DIP переключателей принтера.

 15    n.c.

 16    0V                     - Логичексая земля

 17    CHASSIS GND            - Шасси (земля)

 18    n.c.

 19-30 GND                    - Сигнальная земля (оплетки жил от контактов 1-12)

 31    INIT                   - Инициализация (НИЗКИЙ импульс для сброса принтера)

 32    ERROR                  - Ошибка (НИЗКИЙ если:

                                      (a) кончилась бумага

                                      (b) устройство офф-лайн

                                      (c) состояние ошибки)

 33    GND                    - Сигнальная земля

 34    n.c.

 35    LOGIC 1                - Логический ВЫСОКИЙ (обычно от источника +5 В через 3.3 кОм)

 36    SLCT IN                - Разрешение ввода (данные вводятся в принтер только если на линии НИЗКИЙ,

                                однако зависит от установки DIP переключателей)

 

Как видно из этой таблицы, порт имеет достаточное количество входных и выходных линий, что позволяет подключать множество самых разнообразных устройств, требующих управления от компьютера. Нагрузочная способность выходов в нормальном режиме не более 1 мА, максимум 5 мА и зависит от чипа, на котором реализован интерфейс. Наибольшую нагрузку допускают порты, реализованные в виде отдельной мультикарты, наименьшую - интергрированный в одном чипе контроллер периферии, встроенный в материнскую плату. Для экспериментальной работы лучше использовать отдельные MIO карты, так как при случайных повреждениях страдает дешевая карта, в то время как при повреждении интегрированного контроллера в негодность приходит вся материнская плата.

Порт можно использовать и для питания подсоединенных устройств и позволяет обойтись без внешнего источника питания в случае, если потребляемый ток не превышает 10 мА (КМОП-схемы). Для этого через диоды объединяют неиспользуемые выходы шиной (аноды к выходам, катоды на шину), последовательно устанавливают резистор сопротивлением не менее 100 оМ (для защиты от перегрузки выходов при случайном коротком замыкании), и параллельно на землю - конденсатор емкостью не менее 10 мкФ, для сглаживания пульсаций питающего тока. Так как микросхемы КМОП потребляют ток только в момент переключения, напряжение на конденсаторе будет примерно равно напряжению логической единицы, т.е. не менее 3.6 вольта, что вполне достаточно для питания большинства микросхем.

Для питнаия более мощных устройств использется питание от клавиатуры (через отводной разъем-переходник) или от внешнего источника.

Внимание! При питании от сети надо соединить устройство с разъемом порта, и только потом включить штепсель блока питания в сеть, иначе из-за разницы земляных потенциалов в момент соединения разьема порта какие-либо входы/выходы могут оказаться соединенными раньше, чем вывод земли, и окажутся под потенциалом до 127 вольт, что приведет к выходу из строя чипа порта и/или деталей устройства.
Перед расстыковкой разъема сначала отключают штепсель сети.

Порт можно использовать для превращения компьютера в мощный контроллер, для управления чипами, программирования ПЗУ, в качестве светомузыки, и т. п. В случае, если требуется посдоединять не-ТТЛ оборудование или управлять цепями с повышенной нагрузкой/напряжением, используйте стандартные ТТЛ-развязки и адаптеры. Ключ +22 В показан на схеме читалки в статье ТАКСОФОННЫЕ СМАРТ-КАРТЫ. Для управления сетевыми устройствами рекомендуется использовать гальванически развязанный через оптрон адаптер, гарантирующий полную безопасность:

схема управления сетевой нагрузкой

Номиналы указаны для оптрона с индексом Б. Для оптрона с индексом А номинал входного резистора надо уменьшить с 470 Ом до 330 Ом, а резистор базы с 82 кОм до 15 кОм.

2. Доступ и управление портом

 

Компьютер IBM может управлять тремя параллельными портами LPT1-LPT3. Базовый адрес LPT1 находится в ячейке BIOS 0040:0008 (слово), LPT2 - 0040:000A и т. д. Какой адаптер назначен какому LPT не определено и зависит от конфигурации компьютера и ОС, поэтому программа должна определить используемые ими адреса. При инициализации базовому адресу присваивается 0, если адаптер не установлен.

Адаптер

Регистр
входных данных

Регистр
статуса

Регистр
управления

LPT1

378h

379h

37Ah

LPT2

278h

279h

27Ah

Регистр выходных данных - тот адрес порта, через который проходит каждый байт данных, посылаемый в порт. Регистр статуса сообщает различную информацию о входных линиях; процессор может постоянно опрашивать его, чтобы распознать момент, когда все в порядке и можно посылать данные. Регистр статуса сообщает также, что произошла ошибка (линия ERROR). Регистр управления инициализирует адаптер и управляет выводом данных. Он может также подготавливать параллельный порт для операций преры- вания, с тем чтобы устройство посылало прерывание к процессору, когда оно готово к приему очередной порции данных, оставляя процессор свободным для других дел. Ниже перечислены значения битов регистров статуса и управления:

Регистр управления

бит 0

0 = нормальная установка

1 = вызывает вывод байта данных

бит 1

0 = нормальная установка

1 = автоматический перевод строки после
возврата каретки

бит 2

0 = инициализировать порт принтера

1 = нормальная установка

бит 3

0 = отмена выбора принтера

1 = нормальная установка

бит 4

0 = прерывание принтера запрещено

1 = разрешено

бит 5-7

не используются

 

Регистр статуса

бит 0-2

не используются

бит 3

0 = ошибка принтера

1 = нет ошибки

бит 4

0 = принтер off-line

1 = принтер on-line

бит 5

0 = бумага вставлена

1 = нет бумаги

бит 6

0 = принтер подтверждает прием символа

1= нормальная установки

бит 7

0 = принтер занят

1 = принтер свободен

Из этих таблиц видно, как соотностятся входные линии порта и биты регистров управления и статуса.

Мы можем управлять отдельно каждой выходной линией порта, послыая соответствующий байт в базовый регистр, и знать состояние каждой входной линии, читая из регистров статуса/управления. Для получения базового адреса порта прочитаем его из BIOS:

(ASM):

MOV AX,0040h

MOV ES,AX                      ; записали сегмент BIOS в ES

MOV DX,ES:[8]                  ; прочитали базовый адрес

MOV LPT_BASE, DX               ; и запомнили

INC DX

MOV LPT1_CONTROL,DX            ; добавили 1 и получили рег. управления

INC DX                

MOV LPT1_STATUS,DX             ; добавили еще 1 и получили рег. статуса

...

MOV AL,...                     ; что-то занесли в AL

OUT DX,AL                      ; и записали в порт статуса

(BASIC):

Def Seg = &h40                 ' установили сегмент BIOS

LPT1Base = Peek (9) + &hFF * Peek (8)

LPT1Control = LPTBase + 1

LPT1Status = LPTBase + 2

...

OUT LPT1Base, MyByte           ' вывод данных в порт

...

Status = INP (LPTControl)      ' чтение регистра управления

Если нам необходимо изменить состояние только одного из битов регистра, сначала надо прочитать из него значение и с произвести с ним логическиую операцию OR или AND с маской, где выставлен изменяемый бит, в зависимости от того, хотим мы установить или сбросить этот бит.
Например, требуется установить ВЫСОКИЙ уровень на линии SLCT IN (выбор принтера). Из таблиц видим, что этой линией управляет бит 3 регистра управления. Проделаем следующее:

- прочитаем из этого регистра
- с прочитанным значением делаем операцию OR с маской 00001000b, при этом все немаскированные биты (значение 0 в маске), сохранят свое прежнее значение, а бит 3 станет единцей.
- запишем полученное в регистр

Для сброса этой линии в НИЗКИЙ уровень делаем так:

- прочитаем из этого регистра
- с прочитанным значением делаем операцию AND с маской 11110111b, при этом все маскированные биты (значение 1 в маске), сохранят свое прежнее значение, а бит 3 станет нулем.
- запишем полученное в регистр

Рассмотрим фрагмент кода для таких операций:

(ASM):

; установим ВЫСОКИЙ уровень

MOV DX,LPT1_CONTROL            ; загрузили адрес регистра в DX

MOV AH, 00001000b              ; маску - в AH

IN AL,DX                       ; прочитали регистр

OR AL,AH                       ; отмаскировали

OUT DX,AL                      ; записали обратно

...

; установим НИЗКИЙ

MOV DX,LPT1_CONTROL            ; загрузили адрес регистра в DX

MOV AH, 11110111b              ; маску - в AH (для циклического изменения используем NOT)

IN AL,DX                       ; прочитали регистр

AND AL,AH                      ; отмаскировали

OUT DX,AL                      ; записали обратно

...

(BASIC):

...

' установка ВЫСОКОГО уровня

Mask=8         ' 00001000b

Value = INP (LPT1Control)

Value = Value OR Mask

OUT LPT1Control, Value

...

' установка НИЗКОГО уровня

Mask=247       ' 11110111b

Value = INP (LPT1Control)

Value = Value AND Mask

OUT LPT1Control, Value

...

В статье ТАКСОФОННЫЕ СМАРТ-КАРТЫ описана читалка карточек, подсоединяемая к LPT. Ниже помещен текст программы, использовавшейся для отладки читалки, написанный на языке Basic, которую можно запускать под интерпретатором, входящим в поставку МС-ДОС. Подпрограмма writecard() пишет 0 или 1 во все адреса карточки.

' ---

' --- PayPHONE CARDS ---

' ---

DECLARE SUB writecard ()

DECLARE FUNCTION iif$ (arg AS INTEGER, truepath AS STRING, falsepath AS STRING)

DECLARE SUB shortdelay ()

DECLARE SUB delay (value AS INTEGER)

DECLARE SUB readcard ()

DECLARE SUB cardreset ()

 

' using LPT#1 port

 

CONST lptbase = &H378

CONST lptstatus = lptbase + 1

CONST lptctrl = lptbase + 2

 

DIM SHARED cardtype

 

' --------------------------

'     PinOut Connection:

' --------------------------

'  Wire    Signal    Reader

' --------------------------

'    2       D0      Reset

'    3       D1      Clock

'    4       D2      R/W

'   11      BUSY    I/O 

'   25      GND     GND

' --------------------------

 

start:

 

CLS     ' clear screen

 

PRINT "Select casd type ISO1 - [1]  or ISO2 - [2]:"

 

locr0:  ' loop cicle waiting when user press a key

a$ = UCASE$(INKEY$)

IF a$ = "1" THEN cardtype = 1: GOTO locr1

IF a$ = "2" THEN cardtype = 2: GOTO locr1

GOTO locr0

 

locr1:

 

PRINT "Insert a card and press [R] for Reading; [W] for Writing."

 

loc0:   ' loop cicle waiting when user press a key

a$ = INKEY$

a$ = UCASE$(a$) ' this function make upper-case char

IF a$ = "R" THEN GOTO reading

IF a$ = "W" THEN GOTO writing

GOTO loc0

 

reading:

 

OUT lptctrl, datanorm          ' port initialization

 

CLS            ' clear screen

 

PRINT "Resetting card. Please wait..."

 

cardreset

 

CLS

 

PRINT "Reading card:"

PRINT

PRINT "    byte number     bit number       value        descrtption"

PRINT "     Dec Hex     7 6 5 4 : 3 2 1 0   Dec Hex       (optional)"

PRINT "--8<------------ | | | |   | | | | --------------------------"

 

readcard

 

PRINT "--8<---------------------------------------------------------"

PRINT

PRINT "[N] for new card or [Q] for quit"

 

loc1:   ' loop cicle waiting when user press a key

a$ = INKEY$

a$ = UCASE$(a$)

IF a$ = "N" THEN GOTO start

IF a$ = "Q" THEN END

GOTO loc1

 

writing:

 

CLS

PRINT "Resetting card..."

cardreset

CLS

PRINT "Writing card"

LOCATE 2, 2: PRINT STRING$(32, "ё")

 

writecard

 

PRINT "Now test reading card. Press a key"

SLEEP          ' wait for user press a key

GOTO reading

 

tr1:

PRINT "Ops! An error "; ERR; " occured."

 

END

 

' ------------------------------

' SubRoutines & Functions

' ------------------------------

 

SUB cardreset

   IF cardtype = 2 THEN

      OUT lptbase, &H4        ' CLK & RESET DOWN

      delay 1

      OUT lptbase, &H6        ' CLK UP

      delay 1

      OUT lptbase, &H4        ' CLK DOWN

      delay 1

      OUT lptbase, &H0        ' RESET UP - to normal position

      delay 1

   ELSE

      OUT lptbase, &H0        ' CLK & RESET DOWN

      delay 1

      OUT lptbase, &H2        ' CLK UP

      delay 1

      OUT lptbase, &H0        ' CLK DOWN

      delay 1

      OUT lptbase, &H1        ' RESET UP - to normal position

      delay 1

   END IF

END SUB

 

' ---------------------------

 

SUB delay (value AS INTEGER)

   DIM t AS SINGLE

   t = TIMER + value / 100

   WHILE t > TIMER: WEND

END SUB

 

' ---------------------------

 

FUNCTION iif$ (arg AS INTEGER, truepath AS STRING, falsepath AS STRING)

   IF arg THEN iif$ = truepath ELSE iif$ = falsepath

END FUNCTION

 

' ---------------------------

 

SUB readcard

   DIM i AS INTEGER

   DIM j AS INTEGER

   DIM bit AS INTEGER

   DIM value AS INTEGER

   DIM french AS INTEGER

   CONST true = -1, false = 0

 

   FOR i = 1 TO 32

 

      ' right align the columns

 

      IF i < 10 THEN

         PRINT "Byte " + STR$(i) + " (0x" + iif(LEN(HEX$(i)) = 2, HEX$(i), "0" + HEX$(i)) + ")  ";

      ELSE

         PRINT "Byte" + STR$(i) + " (0x" + iif(LEN(HEX$(i)) = 2, HEX$(i), "0" + HEX$(i)) + ")  ";

      END IF

 

      ' start to reading new byte

 

      FOR j = 1 TO 8

 

         ' after chip has reseted

         ' we already have bit #1

         ' on I/O pin, then get it:

 

         bit = -NOT (-(INP(lptstatus) AND &H80) \ &H80)

         PRINT STR$(bit);

 

         IF j = 4 THEN PRINT " :";

 

         value = value + (2 ^ (8 - j) * bit)

 

         IF cardtype = 2 THEN

 

            OUT lptbase, &H0     ' drop CLK, RESET still raised

            shortdelay

            OUT lptbase, &H2     ' raise CLK

            shortdelay

            OUT lptbase, &H0     ' drop CLK

            shortdelay

 

         ELSE

 

            OUT lptbase, &H1

            shortdelay

            OUT lptbase, &H3     ' raise CLK

            shortdelay

            OUT lptbase, &H1     ' drop CLK

            shortdelay

 

         END IF

 

         ' now card have a next bit

 

      NEXT j

 

   PRINT "  " + STR$(value);

   PRINT SPACE$(5 - LEN(STR$(value)));

   PRINT "(0x" + HEX$(value) + ") ";

 

   ' check what screen filled and scrollup after key press

   IF i= 16 THEN

      PRINT

      PRINT "Press a key to continue...";

      SLEEP

   END IF

 

   PRINT

 

   value = 0

 

   NEXT i

END SUB

 

' ---------------------------

 

SUB shortdelay

   FOR t = 0 TO 1000: NEXT

END SUB

 

' ---------------------------

 

SUB writecard

   OUT lptbase, 0

   delay 5

   zero = -1 ' (pisat nuli ili edinici)

      FOR i = 1 TO 256

            IF zero THEN

               OUT lptbase, 4

               shortdelay

               OUT lptbase, 0

               shortdelay

               OUT lptbase, 2

               shortdelay

               OUT lptbase, 0

               shortdelay

               OUT lptbase, 2

               shortdelay

               OUT lptbase, 0

               shortdelay

            ELSE

               OUT lptbase, 4

               delay 1

               OUT lptbase, 0

               delay 1

               OUT lptbase, 2

               delay 1

               OUT lptbase, 0

               delay 1

               OUT lptbase, 4

               delay 1

               OUT lptbase, 0

               delay 1

               OUT lptbase, 2

               delay 1

               OUT lptbase, 0

               delay 1

               OUT lptbase, 2

               delay 1

               OUT lptbase, 0

               delay 1

            END IF

         LOCATE 2, 2: PRINT STRING$(i / 8, "_")

      NEXT i

END SUB

Прграмма не является законченным средством для обработки карточек и служит для ознакомительных целей, иллюстрируя работу с портом и подсоединенным устройством.

Устройство для чтения/записи магнитных карточек.
Конструкция и принципиальная схема.

 

 

Для изготовления устройства, которое, разумеется, можно применять не только для чтения, но и записи магнитных карточек, удобно использовать готовый лентопротяжный механизм магнитофона или плейера. Карточка при этом протягивается так же как и лента, между тонвалом и тонроликом. Но надо иметь в виду - металлический тонвал проскальзывает по пластиковой поверхности телефонной карточки. Автор одел на тонвал тонкую ПВХ трубочку от изоляции импортного экранированного провода, предварительно окунув ее в ацетон. После высыхания ацетона можно включить моторчик ЛПМ и подшлифовать внешнюю поверхность трубки мелкой наждачкой. Подготовка приводного вала - очень важный момент! Именно от вала в основном зависит равномерность скорости подачи карточки. Впрочем, остальные узлы тоже требуют аккуратности. Несмотря на это устройство полностью можно изготовить за пару выходных дней.
        После подготовки вала необходимо изготовить направляющий тракт. Его конструкция зависит от конкретного ЛПМ, поэтому здесь приводится только эскиз, иллюстрирующий идею. В качестве исходного материала был использован двухсторонний фольгированный стеклотекстолит. Его легко обрабатывать и соединять детали пайкой, без дополнительных крепежных деталей. В конструкции используется  пара светодиод-фотодиод для регистрации моментов начала и окончания прохождения карточки через ЛПМ. Необходимо учитывать, что запись начинается примерно в 3мм от края карточки и располагать головку так, чтобы тонвал успел захватить и начать протаскивать карточку до того, как начало записи окажется в рабочей зоне головки. Примерно в этот же момент должен срабатывать и оптодатчик. У меня карточка после прохождения ЛПМ по инерции проскакивает дальше и открывает оптодатчик снова. Но лучше поставить второй оптодатчик на окончание карточки, чуть правее оси магнитного зазора головки.
         Эскиз конструкции
Рис.1. Эскиз устройства для чтения магнитных карточек.
1- направляющие желобки из жести; 2- светодиод; 3- фотодиод; 4- неподвижная пластина узла головки; 5- подвижная пластина узла головки; 6- основание; 7- контактная плата; 8- магнитная карточка; 9- тонролик; 10- тонвал.

Эскиз устройства приведен на рисунке 1. Особую сложность представляет только узел крепления головки, так как надо прижимать головку к карточке, а не наоборот. Площадка с прикрепленной к ней головкой равномерно прижимается четырьмя пружинками. Прижимное усилие должно быть небольшим, т.к. магнитный слой намагничен очень сильно. Сохранена возможность регулировки азимута головки. Провода, идущие от головки - тонкие неэкранированные, не должны мешать смещению площадки с головкой. Они подведены к контактным площадкам недалеко от головки. Далее идут экранированные провода. Моторчик питается непосредственно от 5-вольтового напряжения питания всей схемы. Моторчик от плеера обеспечивает при этом необходимую скорость движения карточки. Помехи легко шунтируются керамическим конденсатором, расположенным на выводах моторчика.

Принципиальная схема

        Принципиальная схема приведена на рисунке 2. За основу взята схема "читалки" от Spectrum-совместимого компьютера "Ленинград". Добавлен только входной каскад на одном транзисторе. При исправных деталях схема не требует наладки, собрана у автора на макетной плате. Обратите особое внимание на тщательное экранирование узлов и соединений. Схемка с ключевым транзистором для оптодатчика не показана в силу своей примитивности.

Simple PC smartcard reader

This simple PC Smartcard reader was shown in Electronics Design magazine February 17, 1997 issue on page 172 in the ideas for design secation. The circuit is designed by Jose Carlos Cossio and is based on simple smartcard reader design shown on the same magasine July 8, 1996.

This circuit takes all smartcard operating power form PC parallel port. The basic circuit idea is quites imilar to thw simple smartcard reader shown in What you need to know about electronics telecards written by Stephane Bausson. There are some minor differences, which means that all the same software can't ne used.

 

PC

Parallel

port

 

25 o---------------------------------------------------------------+

   GND                                                             |

                                      ISO layout                   |

                                                                   |

                                 /---------+--------\              |

                          +------| VCC     |    GND |--------------+

   D2                     |      |------\  |  /-----+              |

 4 o----------------------)------| R/W   \ | /  Vpp |--------+     |

   D1                     |      +--------( )-------+        |     |

 3 o----------------------)------| CLK   / | \  I/O |----+   |     |

   D0                     |      +------/  |  \-----+    |   |     |

 2 o----------------------)------| RST     |   Fuse |    |   |     |

                          |      \---------+--------/    |   |     |

   Busy                   |                              |   |     |

11 o----------------------)------------------------------+   |     |

                          |                                  |     |

                          +----------------------------------+     |

   D3          |\ |       |                                        |

 5 o-----------| >+-------+                                        |

               |/ |       |            ||                          |

                          +------------||--------------------------+

   D4          |\ |       |            ||

 6 o-----------| >+-------+

               |/ |       |          100 nF

                          |

   D5          |\ |       |

 7 o-----------| >+-------+

               |/ |       |

                          |

   D6          |\ |       |

 8 o-----------| >+-------+

               |/ |       |

                          |

   D7          |\ |       |

 9 o-----------| >+-------'

               |/ |

 

            5 X 1N4148

Технология изготовления 
магнитных карточек 

Магнитная карта Urmet Patent    В качестве примера рассмотрим таксофонную магнитную карту Urmet Patent. Таксофоны, использующие эти карты, имеются, в частности, во многих городах России. Карта представляет собой прямоугольник из упругого тонкого пластика, на который с одной стороны наносится полоска магнитного материала (на рисунке черная), с другой стороны - рекламная картинка. Левый верхний угол отрывной. Он играет роль пломбы, подтверждающей, что до вас этой картой никто не пользовался. Перед началом эксплуатации его удаляют.
        В этой статье мы рассмотрим, как самостоятельно изготовить такую карту с применением немного необычной технологии. Пока не будем касаться вопроса схемотехники и конструкции устройства для чтения-записи информации, поговорим о самой карточке. Считывание магнитной записи с карточки имеет свои особенности. В обычном магнитофоне лента плотно прижимается к головке специальной подпружиненной подушечкой и, к тому же, немного огибает головку. Это удается сделать, потому что лента очень тонкая и мягкая. С карточкой так не получится. Из-за того, что карточка жесткая и ее материал имеет некоторые остаточные неровности, не удается обеспечить идеальное прилегание считывающей головки к магнитному носителю. При сильном прижиме головки к карточке может возникнуть ее притормаживание в подающем тракте и возникнет сильный износ головки и носителя самой карточки. Поэтому реально головка практически не касается дорожки на карточке, находясь на микронном расстоянии от нее. Применяются либо обычные индукционные головки, либо полупроводниковые магниточувствительные приборы.Карточку обычно носят в кошельке или  кармане, где ее магнитный слой может поцарапаться, но необходимо гарантировать клиенту устойчивое считывание карточки даже при наличии микродефектов. Все эти проблемы на практике решают, применяя достаточно толстый слой магнитного носителя, имеющего высокую коэрцитивность (способность к намагничиванию).
        Для изготовления самодельной карточки нам понадобятся:

        Способ изготовления во многом ясен из рисунка. Почему нельзя просто приклеить полоску магнитного носителя, вырезанную из материала дискеты на кусок картона? Потому, что крайне сложно нанести быстросохнущий клей очень тонким ровным слоем и аккуратно приклеить магнитную полоску так, чтобы клей не выступал из-под ее краев.
Итак, сначала делаем заготовку, по размеру близкую к карточке, но чуть больше. Берем тонкий картон, по толщине примерно как маленький календарик. Но необходимо, чтобы у него была только одна глянцевая сторона, поэтому календарик не подойдет - ПВА плохо прилипнет. Берем импортную самоклеящуюся бумагу с отрывной основой. Такую цветную бумагу можно купить в магазине канцтоваров. Аккуратно смазываем клеем ПВА шершавую сторону картона и бумагу. Не испачкайте обратную сторону картона. Складываем намазанные слои, кладем заготовку на плотную ровную поверхность и через газетку проглаживаем утюгом. Утюг включаем на "шелк" или чуть горячее. Кто делал "дембельский альбом", уже натренирован в таком методе склеивания. Гладим с двух сторон. Через несколько минут бутерброд будет готов. Если его сильно коробит после остывания, и не удается отгладить, значит картон не подходит. Попробуйте другой картон, можно вообще без глянца. Разберите дискету, вырежьте из нее полоску, равную по ширине заводской, но чуть длиннее. Из бумажной заготовки по образцу вырежьте саму карточку. Отслоите защитный слой от самоклеящейся бумаги и аккуратно приклейте в нужное место магнитную полоску. Перед этим вымойте руки и вообще будьте очень аккуратны. Малейшая соринка, попавшая под магнитную полоску, погубит вашу работу. Оторватьполоску обратно вы уже не сможете. Возьмите  тонкую писчую бумагу и подклейте встык к краям магнитной полоски. Подберите бумагу по толщине магнитной ленты. Не используйте кальку и подобную ей вощеную бумагу. Она может отклеиться от основы. Обрежьте излишки бумаги по краям. Бритвенным лезвием срежьте излишки магнитной полоски, сняв небольшую фасочку по краям. Удалите, при необходимости, заусенцы по краям карточки. Болванка для последующей записи готова. Метод не так сложен, как это может показаться, и позволяет делать болванки чуть ли не партиями.

 

1. Особенности магнитной записи

 

Принцип магнитной записи ничем не отличается от принятого в звукозаписи. Для его реализации подходит звуковая аппаратура. Стирание можно делать постоянным магнитом с пластиной - концентратором магнитного потока. Хотя при таком стирании велик уровень шумов, для цифрового считывания это не важно. Запись производят без подмагничивания постояныым или ВЧ током, так даже достигаются более резкие переходы намагниченности носителя. Для изготовления магнитной полоски самодельных карточек подойдет старая 5 " дискета на 360 Кб, имеющая слой с низкой коэрцитивностью.
Кодирование данных осуществляется общепринятым методом "без возврата к нулю", который исключает длинные участки постоянной намагниченности, что облегчает синхроннизацию при считывании.

 

Усиленный выходной сигнал с читающей головки проходит двухпороговый компаратор, формирующий ВЫСОКИЙ и НИЗКИЙ логичекие уровни. Цифровые данные поступают на стандартный последовательный интерфейс (типа RS-232), передающий данные на обработку компьютеру.

 

На рисунке видно, что если в момент синхро-отсчета уровень сигнала НЕ меняется, то он считается равным НУЛЮ, а если сигнал имеет перепад, то ЕДИНИЦЕ.

Форматы кодирования данных

 

** Формат данных ANSI/ISO BCD **


Этот вариант кодирования имеет длину слова в 5 бит. Первые четыре бита - данные, a 5-й - бит четности. Cумма всех пяти битов должна давать НЕчетное число. Младший бит b1 считывается первым в серии.

b1

b2

b3

b4

b5

Символ

Значение

0

0

0

0

1

0 (0H)

Цифра

1

0

0

0

0

1 (1H)

"

0

1

0

0

0

2 (2H)

"

1

1

0

0

1

3 (3H)

"

0

0

1

0

0

4 (4H)

"

1

0

1

0

1

5 (5H)

"

0

1

1

0

1

6 (6H)

"

1

1

1

0

0

7 (7H)

"

0

0

0

1

0

8 (8H)

"

1

0

0

1

1

9 (9H)

"

0

1

0

1

1

: (AH)

Управление

1

1

0

1

0

; (BH)

Начало последовательности

0

0

1

1

1

< (CH)

Управление

1

0

1

1

0

= (DH)

Разделитель полей

0

1

1

1

0

> (EH)

Управление

1

1

1

1

1

? (FH)

Конец последовательности

** Формат данных ANSI/ISO буквенный**

Этот формат (буквенно-цифровой) содержит определения 64 символов, при 7-битном кодировании, 6 значащих битах, и седьмом бите четности, как и в предыдущем формате. Младший бит b1 считывается первым.

b1

b2

b3

b4

b5

b6

b7

Символ

Значение

0

0

0

0

0

0

1

space (0H)

Специальный

1

0

0

0

0

0

0

! (1H)

"

0

1

0

0

0

0

0

" (2H)

"

1

1

0

0

0

0

1

# (3H)

"

0

0

1

0

0

0

0

$ (4H)

"

1

0

1

0

0

0

1

% (5H)

Начало последовательности

0

1

1

0

0

0

1

& (6H)

Специальный

1

1

1

0

0

0

0

' (7H)

"

0

0

0

1

0

0

0

( (8H)

"

1

0

0

1

0

0

1

) (9H)

"

0

1

0

1

0

0

1

* (AH)

"

1

1

0

1

0

0

0

+ (BH)

"

0

0

1

1

0

0

1

, (CH)

"

1

0

1

1

0

0

0

- (DH)

"

0

1

1

1

0

0

0

. (EH)

"

1

1

1

1

0

0

1

/ (FH)

"

0

0

0

0

1

0

0

0 (10H)

Данные (цифры)

1

0

0

0

1

0

1

1 (11H)

"

0

1

0

0

1

0

1

2 (12H)

"

1

1

0

0

1

0

0

3 (13H)

"

0

0

1

0

1

0

1

4 (14H)

"

1

0

1

0

1

0

0

5 (15H)

"

0

1

1

0

1

0

0

6 (16H)

"

1

1

1

0

1

0

1

7 (17H)

"

0

0

0

1

1

0

1

8 (18H)

"

1

0

0

1

1

0

0

9 (19H)

"

0

1

0

1

1

0

0

: (1AH)

Специальный

1

1

0

1

1

0

1

; (1BH)

"

0

0

1

1

1

0

0

< (1CH)

"

1

0

1

1

1

0

1

= (1DH)

"

0

1

1

1

1

0

1

> (1EH)

"

1

1

1

1

1

0

0

? (1FH)

Конец пос-ти

0

0

0

0

0

1

0

@ (20H)

Специальный

1

0

0

0

0

1

1

A (21H)

Данные (буквы)

0

1

0

0

0

1

1

B (22H)

"

1

1

0

0

0

1

0

C (23H)

"

0

0

1

0

0

1

1

D (24H)

"

1

0

1

0

0

1

0

E (25H)

"

0

1

1

0

0

1

0

F (26H)

"

1

1

1

0

0

1

1

G (27H)

"

0

0

0

1

0

1

1

H (28H)

"

1

0

0

1

0

1

0

I (29H)

"

0

1

0

1

0

1

0

J (2AH)

"

1

1

0

1

0

1

1

K (2BH)

"

0

0

1

1

0

1

0

L (2CH)

"

1

0

1

1

0

1

1

M (2DH)

"

0

1

1

1

0

1

1

N (2EH)

"

1

1

1

1

0

1

0

O (2FH)

"

0

0

0

0

1

1

1

P (30H)

"

1

0

0

0

1

1

0

Q (31H)

"

0

1

0

0

1

1

0

R (32H)

"

1

1

0

0

1

1

1

S (33H)

"

0

0

1

0

1

1

0

T (34H)

"

1

0

1

0

1

1

1

U (35H)

"

0

1

1

0

1

1

1

V (36H)

"

1

1

1

0

1

1

0

W (37H)

"

0

0

0

1

1

1

0

X (38H)

"

1

0

0

1

1

1

1

Y (39H)

"

0

1

0

1

1

1

1

Z (3AH)

"

1

1

0

1

1

1

0

[ (3BH)

Специальный

0

0

1

1

1

1

1

\ (3DH)

Специальный

1

0

1

1

1

1

0

] (3EH)

Специальный

0

1

1

1

1

1

0

^ (3FH)

Разделитель полей

1

1

1

1

1

1

1

_ (40H)

Специальный

 

 

Форматы записи дорожек

 

 

Запись на дорожке начинается с серии нулей (сигналов "НИЗКОГО" уровня, а не символов), число которых бывает разным, но не менне шестнадцати. Этот форвард служит для синхронизации такта считывателя. Далее записывается информация в формате, в зависимости от номера дорожки, как показывает таблица:

Дорожка ј1

НП

КФ

НПС

Имя

РП

Доп. данные

КП

LRC

 

Дорожка ј2

НП

НПС

РП

Доп. данные

КП

LRC

 

Дорожка ј3

подобно дорожкам 1 и 2. В большинстве случаев не используется.

 

НП

Начало Последовательности

КФ

Код Формата

НПС

Номер Первичного Cчета (19 цифр макс)

РП

Разделитель Полей

Имя

(макс. 26 знаков)

Доп. данные

дата истечения, код шифра и т. п.

КП

Конец Последовательности

LRC

Код контроля четности

Формат кодирования по разным дорожкам и плотность записи различна и соответствует таблице:

Дорожка

Плотность

Формат

Кол-во
символов

1

210 bpi

букв-цифр

79

2

75 bpi

BCD

40

3

210 bpi

BCD

107

Кодирование управляющих символов в соответствии со стандартом каждой дорожки.
Завершает запись дорожки такая же, как в начале, последовательность нулей.

Примеры записанного на карточках

 

Номер на лицевой стороне карточки: 1111 2222 3333 4444
Срок действия до: 12 / 99


-=Mastercard=-  

 

Track 2 (BCD, 75 bpi)-> ;1111222233334444=99121010000000000000?

 

Ttrack 1 (ALPHA, 210 bpi)-> %B1111222233334444^PUBLIC/JOHN?

 

* примеч.: "101" встречается на большинстве провереных карточек, также как и "В".


 

-=VISA=-

 

T2 (BCD,75 bpi)-> ;1111222233334444=9912101xxxxxxxxxxxxx?

                                      

T1 (ALPHA,210 bpi)-> %B1111222233334444^PUBLIC/JOHN^9912101xxxxxxxxxxxxx?

                     

* примеч.: 101 и В см выше. Также, ххх разные от карте к карте, и могут означать закодировванный номер

  счета, в любом случае, я нашел 13 цифр номера счета.


 

-=Discover=- 

 

T2 (BCD,75 bpi)-> ;1111222233334444=991210100000?

                                       

 

T1 (ALPHA,210 bpi)-> %B1111222233334444^PUBLIC/JOHN___^991210100000?

                                                           

* примеч.: "10100000" и "B" и иногда встречается "10110000".Подчерки после имени JOHN означают, что имя

  дополняется до 26 символов ПРОБЕЛАМИ.


 

-=US Sprint FON=-  Номер карточки -> 111 222 3333 4444

 

Track 2 (BCD,75 bpi)-> ;xxxxxx11122233339==xxx4444xxxxxxxxxx=?

 

Track 1 (ALPHA,210 bpi)-> %B^ /^^xxxxxxxxxxxxxxxxx?

                          

* такое впечатление, что 1 дорожка не используется.


 

-=Fleet Bank=-  Номер карточки -> 111111 222 3333333

 

T2-> ;1111112223333333=9912120100000000xxxx?

 

T1-> %B1111112223333333^PUBLIC/JOHN___^9912120100000000000000xxxx000000?

 

* данные "xxxх" варьируют. это закодированое PIN смещение.  Всегда 4

цифры (хммм...).  "1201" всегда одни и те-же... Даже в карточках из разных банков.

 

Hosted by uCoz